home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / stringsearch / bmsource / uf.fwdm.inc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-06  |  2.5 KB  |  133 lines  |  [TEXT/MPS ]

  1. /*
  2.     search routine generated by gen.
  3.     skip=uf, match=fwdm (using fwdmr), shift=inc
  4. */
  5. /*
  6.  * The authors of this software are Andrew Hume and Daniel Sunday.
  7.  * 
  8.  * Copyright (c) 1991 by AT&T and Daniel Sunday.
  9.  * 
  10.  * Permission to use, copy, modify, and distribute this software for any
  11.  * purpose without fee is hereby granted, provided that this entire notice
  12.  * is included in all copies of any software which is or includes a copy
  13.  * or modification of this software and in all copies of the supporting
  14.  * documentation for such software.
  15.  * 
  16.  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
  17.  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
  18.  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  19.  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  20.  */
  21.  
  22. #ifndef    CHARTYPE
  23. #define    CHARTYPE    unsigned char
  24. #endif
  25. #define    MAXPAT    256
  26.  
  27. #include    "stats.h"
  28.  
  29. #ifndef    TABTYPE
  30. #define    TABTYPE    long
  31. #endif
  32. typedef TABTYPE Tab;
  33.  
  34. static struct
  35. {
  36.     int patlen;
  37.     CHARTYPE pat[MAXPAT];
  38.     Tab delta[256];
  39. } pat;
  40.  
  41. prep(base, m)
  42.     CHARTYPE *base;
  43.     register m;
  44. {
  45.     CHARTYPE *skipc;
  46.     register CHARTYPE *pe, *p;
  47.     register int j;
  48.     register Tab *d;
  49.  
  50.     pat.patlen = m;
  51.     if(m > MAXPAT)
  52.         abort();
  53.     memcpy(pat.pat, base, m);
  54.     skipc = 0;
  55.     stats.len = m;
  56.     d = pat.delta;
  57.     for(j = 0; j < 256; j++)
  58.         d[j] = pat.patlen;
  59.     for(p = pat.pat, pe = p+m-1; p < pe; p++)
  60.         d[*p] = pe-p;
  61.     d[*p] = 0;
  62.     skipc = (CHARTYPE *)p;
  63. }
  64.  
  65. exec(base, n)
  66.     CHARTYPE *base;
  67. {
  68.     int nmatch = 0;
  69.     register CHARTYPE *e, *s;
  70.     register Tab *d0 = pat.delta;
  71.     register k;
  72. #ifdef    STATS
  73.     register CHARTYPE *p, *q;
  74.     register CHARTYPE *ep;
  75. #else
  76.     register CHARTYPE *sp;
  77. #endif
  78.     register n1;
  79.  
  80.     s = base+pat.patlen-1;
  81.     e = base+n;
  82.     memset(e, pat.pat[pat.patlen-1], pat.patlen);
  83.     n1 = pat.patlen-1;
  84. #ifdef    STATS
  85.     ep = pat.pat + n1;
  86. #else
  87.     sp = pat.pat;
  88. #endif
  89.     while(s < e){
  90. #ifdef    STATS
  91.         k = d0[*s];
  92.         stats.jump++;
  93.         while(k){
  94.             stats.jump++; stats.step[k]++;
  95.             k = d0[*(s += k)];
  96.             stats.jump++; stats.step[k]++;
  97.             k = d0[*(s += k)];
  98.             stats.jump++; stats.step[k]++;
  99.             k = d0[*(s += k)];
  100.         }
  101. #else
  102.         k = d0[*s];
  103.         while(k){
  104.             k = d0[*(s += k)];
  105.             k = d0[*(s += k)];
  106.             k = d0[*(s += k)];
  107.         }
  108. #endif
  109.         if(s >= e)
  110.             break;
  111. #ifdef    STATS
  112.         stats.slow++;
  113. #endif
  114. #ifdef    STATS
  115.         for(p = pat.pat, q = s-n1; p < ep; ){
  116.             stats.cmp++;
  117.             if(*q++ != *p++)
  118.                 goto mismatch;
  119.         }
  120. #else
  121.         if(memcmp(sp, s-n1, n1))    /* warning: some memcmps don't care for n1==0 */
  122.             goto mismatch;
  123. #endif
  124.         nmatch++;
  125.     mismatch:
  126.         s++;
  127. #ifdef    STATS
  128.         stats.step[1]++;
  129. #endif
  130.     }
  131.     return(nmatch);
  132. }
  133.